﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DotHandler
{
    /// <summary>
    /// Nó de dados de uma coleção
    /// </summary>
    public abstract class Node
    {
        #region Identity
        /*****************************************************************/
        /// <summary>
        /// Id único gerado ao incluir o nó em uma coleção
        /// </summary>
        /// <param name="id">Valor do id à partir do índice na coleção</param>
        public void Identity(int id)
        {
            this._id = id;
        }
        private int _id = -1;
        public int Id
        {
            get
            {
                return this._id;
            }
            set{
                if(this._id == -1 ){
                    this._id = value;
                }   
            }
        }
        /*****************************************************************/
        #endregion

        #region Key
        /*****************************************************************/
        /// <summary>
        /// Chave de decodificação à partir de uma propriedade
        /// </summary>
        protected string _key;
        public string Key
        {
            get
            {
                return (this._key!=null)?this._key:"Id";
            }
            set
            {
                if(this._key!=null){
                    this._key = value;
                }
            }
        }
        /*****************************************************************/
        #endregion

        #region Acesso
        /*****************************************************************/
        /// <summary>
        /// Acesso à proppriedade property em seu valor original
        /// </summary>
        /// <param name="property">Nome exato da proprieade</param>
        /// <returns>Propriedade property</returns>
        public dynamic GetProperty(string property)
        {
            dynamic prop;
            try
            {
                prop = this.GetType().GetProperty(property);
            }
            catch
            {
                prop = this.GetType().GetProperty(_key);
            }
            return prop.GetValue(this, null);
        }
        /// <summary>
        /// Decodificação de propriedade em valor
        /// </summary>
        /// <returns>String do valor da propriedade</returns>
        public string ToString(dynamic rule = null)
        {
            String value = this.GetProperty((rule != null) ? rule : this.Key).ToString();
            return value.ToLower();
        }
        public override string ToString()
        {
            return this.ToString(null);
        }

        /*****************************************************************/
        #endregion
    }
}
